/*
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.schema.domain.thing;

import java.net.URL;
import java.util.Date;
import org.schema.domain.Thing;
import org.schema.domain.thing.Organization;
import org.schema.domain.thing.Person;
import org.schema.domain.thing.Place;
import org.schema.domain.thing.creativeWork.MediaObject;
import org.schema.domain.thing.creativeWork.Review;
import org.schema.domain.thing.creativeWork.mediaObject.AudioObject;
import org.schema.domain.thing.creativeWork.mediaObject.VideoObject;
import org.schema.domain.thing.event.userInteraction.UserComments;
import org.schema.domain.thing.intangible.Offer;
import org.schema.domain.thing.intangible.rating.AggregateRating;

/**
 * The most generic kind of creative work, including books, movies, photographs, software programs, etc.
 */
public interface CreativeWork extends Thing {

	/**
	 * The subject matter of the content.
	 *
 	 * @return Thing
	 */
	Thing getAbout();

	/**
	 * The subject matter of the content.
	 *
 	 * @param thing
	 * @return void
	 */
	void setAbout(Thing thing);

	/**
	 * Specifies the Person that is legally accountable for the CreativeWork.
	 *
 	 * @return Person
	 */
	Person getAccountablePerson();

	/**
	 * Specifies the Person that is legally accountable for the CreativeWork.
	 *
 	 * @param person
	 * @return void
	 */
	void setAccountablePerson(Person person);

	/**
	 * The overall rating, based on a collection of reviews or ratings, of the item.
	 *
 	 * @return AggregateRating
	 */
	AggregateRating getAggregateRating();

	/**
	 * The overall rating, based on a collection of reviews or ratings, of the item.
	 *
 	 * @param aggregateRating
	 * @return void
	 */
	void setAggregateRating(AggregateRating aggregateRating);

	/**
	 * A secondary title of the CreativeWork.
	 *
 	 * @return String
	 */
	String getAlternativeHeadline();

	/**
	 * A secondary title of the CreativeWork.
	 *
 	 * @param string
	 * @return void
	 */
	void setAlternativeHeadline(String string);

	/**
	 * The media objects that encode this creative work. This property is a synonym for encodings.
	 *
 	 * @return MediaObject
	 */
	MediaObject getAssociatedMedia();

	/**
	 * The media objects that encode this creative work. This property is a synonym for encodings.
	 *
 	 * @param mediaObject
	 * @return void
	 */
	void setAssociatedMedia(MediaObject mediaObject);

	/**
	 * An embedded audio object.
	 *
 	 * @return AudioObject
	 */
	AudioObject getAudio();

	/**
	 * An embedded audio object.
	 *
 	 * @param audioObject
	 * @return void
	 */
	void setAudio(AudioObject audioObject);

	/**
	 * The author of this content. Please note that author is special in that HTML 5 provides a special mechanism for indicating authorship via the rel tag. That is equivalent to this and may be used interchangabely.
	 *
 	 * @return Thing
	 */
	Thing getAuthor();

	/**
	 * The author of this content. Please note that author is special in that HTML 5 provides a special mechanism for indicating authorship via the rel tag. That is equivalent to this and may be used interchangabely.
	 *
 	 * @param thing
	 * @return void
	 */
	void setAuthor(Thing thing);

	/**
	 * Awards won by this person or for this creative work.
	 *
 	 * @return String
	 */
	String getAwards();

	/**
	 * Awards won by this person or for this creative work.
	 *
 	 * @param string
	 * @return void
	 */
	void setAwards(String string);

	/**
	 * Comments, typically from users, on this CreativeWork.
	 *
 	 * @return UserComments
	 */
	UserComments getComment();

	/**
	 * Comments, typically from users, on this CreativeWork.
	 *
 	 * @param userComments
	 * @return void
	 */
	void setComment(UserComments userComments);

	/**
	 * The location of the content.
	 *
 	 * @return Place
	 */
	Place getContentLocation();

	/**
	 * The location of the content.
	 *
 	 * @param place
	 * @return void
	 */
	void setContentLocation(Place place);

	/**
	 * Official rating of a piece of content—for example,'MPAA PG-13'.
	 *
 	 * @return String
	 */
	String getContentRating();

	/**
	 * Official rating of a piece of content—for example,'MPAA PG-13'.
	 *
 	 * @param string
	 * @return void
	 */
	void setContentRating(String string);

	/**
	 * A secondary contributor to the CreativeWork.
	 *
 	 * @return Thing
	 */
	Thing getContributor();

	/**
	 * A secondary contributor to the CreativeWork.
	 *
 	 * @param thing
	 * @return void
	 */
	void setContributor(Thing thing);

	/**
	 * The party holding the legal copyright to the CreativeWork.
	 *
 	 * @return Thing
	 */
	Thing getCopyrightHolder();

	/**
	 * The party holding the legal copyright to the CreativeWork.
	 *
 	 * @param thing
	 * @return void
	 */
	void setCopyrightHolder(Thing thing);

	/**
	 * The year during which the claimed copyright for the CreativeWork was first asserted.
	 *
 	 * @return Integer
	 */
	Integer getCopyrightYear();

	/**
	 * The year during which the claimed copyright for the CreativeWork was first asserted.
	 *
 	 * @param integer1
	 * @return void
	 */
	void setCopyrightYear(Integer integer1);

	/**
	 * The creator of the UserComment.
	 *
 	 * @return Person
	 */
	Person getCreator();

	/**
	 * The creator of the UserComment.
	 *
 	 * @param person
	 * @return void
	 */
	void setCreator(Person person);

	/**
	 * The date on which the CreativeWork was created.
	 *
 	 * @return Date
	 */
	Date getDateCreated();

	/**
	 * The date on which the CreativeWork was created.
	 *
 	 * @param date1
	 * @return void
	 */
	void setDateCreated(Date date1);

	/**
	 * The date on which the CreativeWork was most recently modified.
	 *
 	 * @return Date
	 */
	Date getDateModified();

	/**
	 * The date on which the CreativeWork was most recently modified.
	 *
 	 * @param date1
	 * @return void
	 */
	void setDateModified(Date date1);

	/**
	 * Date of first broadcast/publication.
	 *
 	 * @return Date
	 */
	Date getDatePublished();

	/**
	 * Date of first broadcast/publication.
	 *
 	 * @param date1
	 * @return void
	 */
	void setDatePublished(Date date1);

	/**
	 * A link to the page containing the comments of the CreativeWork.
	 *
 	 * @return URL
	 */
	URL getDiscussionUrl();

	/**
	 * A link to the page containing the comments of the CreativeWork.
	 *
 	 * @param uRL1
	 * @return void
	 */
	void setDiscussionUrl(URL uRL1);

	/**
	 * Editor for this content.
	 *
 	 * @return Person
	 */
	Person getEditor();

	/**
	 * Editor for this content.
	 *
 	 * @param person
	 * @return void
	 */
	void setEditor(Person person);

	/**
	 * The media objects that encode this creative work
	 *
 	 * @return MediaObject
	 */
	MediaObject getEncodings();

	/**
	 * The media objects that encode this creative work
	 *
 	 * @param mediaObject
	 * @return void
	 */
	void setEncodings(MediaObject mediaObject);

	/**
	 * Genre of the creative work
	 *
 	 * @return String
	 */
	String getGenre();

	/**
	 * Genre of the creative work
	 *
 	 * @param string
	 * @return void
	 */
	void setGenre(String string);

	/**
	 * Headline of the article
	 *
 	 * @return String
	 */
	String getHeadline();

	/**
	 * Headline of the article
	 *
 	 * @param string
	 * @return void
	 */
	void setHeadline(String string);

	/**
	 * The language of the content. please use one of the language codes from the IETF BCP 47 standard.
	 *
 	 * @return String
	 */
	String getInLanguage();

	/**
	 * The language of the content. please use one of the language codes from the IETF BCP 47 standard.
	 *
 	 * @param string
	 * @return void
	 */
	void setInLanguage(String string);

	/**
	 * A count of a specific user interactions with this item—for example, 20 UserLikes, 5 UserComments, or 300 UserDownloads. The user interaction type should be one of the sub types of UserInteraction.
	 *
 	 * @return String
	 */
	String getInteractionCount();

	/**
	 * A count of a specific user interactions with this item—for example, 20 UserLikes, 5 UserComments, or 300 UserDownloads. The user interaction type should be one of the sub types of UserInteraction.
	 *
 	 * @param string
	 * @return void
	 */
	void setInteractionCount(String string);

	/**
	 * Indicates whether this content is family friendly.
	 *
 	 * @return Boolean
	 */
	Boolean getIsFamilyFriendly();

	/**
	 * Indicates whether this content is family friendly.
	 *
 	 * @param boolean1
	 * @return void
	 */
	void setIsFamilyFriendly(Boolean boolean1);

	/**
	 * The keywords/tags used to describe this content.
	 *
 	 * @return String
	 */
	String getKeywords();

	/**
	 * The keywords/tags used to describe this content.
	 *
 	 * @param string
	 * @return void
	 */
	void setKeywords(String string);

	/**
	 * Indicates that the CreativeWork contains a reference to, but is not necessarily about a concept.
	 *
 	 * @return Thing
	 */
	Thing getMentions();

	/**
	 * Indicates that the CreativeWork contains a reference to, but is not necessarily about a concept.
	 *
 	 * @param thing
	 * @return void
	 */
	void setMentions(Thing thing);

	/**
	 * An offer to sell this item—for example, an offer to sell a product, the DVD of a movie, or tickets to an event.
	 *
 	 * @return Offer
	 */
	Offer getOffers();

	/**
	 * An offer to sell this item—for example, an offer to sell a product, the DVD of a movie, or tickets to an event.
	 *
 	 * @param offer
	 * @return void
	 */
	void setOffers(Offer offer);

	/**
	 * Specifies the Person or Organization that distributed the CreativeWork.
	 *
 	 * @return Thing
	 */
	Thing getProvider();

	/**
	 * Specifies the Person or Organization that distributed the CreativeWork.
	 *
 	 * @param thing
	 * @return void
	 */
	void setProvider(Thing thing);

	/**
	 * The publisher of the creative work.
	 *
 	 * @return Organization
	 */
	Organization getPublisher();

	/**
	 * The publisher of the creative work.
	 *
 	 * @param organization
	 * @return void
	 */
	void setPublisher(Organization organization);

	/**
	 * Link to page describing the editorial principles of the organization primarily responsible for the creation of the CreativeWork.
	 *
 	 * @return URL
	 */
	URL getPublishingPrinciples();

	/**
	 * Link to page describing the editorial principles of the organization primarily responsible for the creation of the CreativeWork.
	 *
 	 * @param uRL1
	 * @return void
	 */
	void setPublishingPrinciples(URL uRL1);

	/**
	 * Review of the item.
	 *
 	 * @return Review
	 */
	Review getReviews();

	/**
	 * Review of the item.
	 *
 	 * @param review
	 * @return void
	 */
	void setReviews(Review review);

	/**
	 * The Organization on whose behalf the creator was working.
	 *
 	 * @return Organization
	 */
	Organization getSourceOrganization();

	/**
	 * The Organization on whose behalf the creator was working.
	 *
 	 * @param organization
	 * @return void
	 */
	void setSourceOrganization(Organization organization);

	/**
	 * A thumbnail image relevant to the Thing.
	 *
 	 * @return URL
	 */
	URL getThumbnailUrl();

	/**
	 * A thumbnail image relevant to the Thing.
	 *
 	 * @param uRL1
	 * @return void
	 */
	void setThumbnailUrl(URL uRL1);

	/**
	 * The version of the CreativeWork embodied by a specified resource.
	 *
 	 * @return Integer
	 */
	Integer getVersion();

	/**
	 * The version of the CreativeWork embodied by a specified resource.
	 *
 	 * @param integer1
	 * @return void
	 */
	void setVersion(Integer integer1);

	/**
	 * An embedded video object.
	 *
 	 * @return VideoObject
	 */
	VideoObject getVideo();

	/**
	 * An embedded video object.
	 *
 	 * @param videoObject
	 * @return void
	 */
	void setVideo(VideoObject videoObject);

}